package mine.code.question.动态规划;

import org.junit.Test;

import java.util.Arrays;

/**
 * 给出 n 个数对。 在每一个数对中，第一个数字总是比第二个数字小。
 * <p>
 * 现在，我们定义一种跟随关系，当且仅当 b < c 时，数对(c, d) 才可以跟在 (a, b) 后面。我们用这种形式来构造一个数对链。
 * <p>
 * 给定一个对数集合，找出能够形成的最长数对链的长度。你不需要用到所有的数对，你可以以任何顺序选择其中的一些数对来构造。
 *
 * @author caijinnan
 * @date 2020/4/7 15:51
 */
public class 最长数对链 {
    @Test
    public void run() {
        int[][] pairs = {{1, 2}, {2, 3}, {3, 4},{5,6}};
        System.out.println(findLongestChain(pairs));
    }

    // 动态规划
    //dp[i] = int[i][1]<pairs[i][0]?1:0+dp[i-1];
    public int findLongestChain(int[][] pairs) {
        int length = pairs.length;
        if (length == 0) {
            return 0;
        }
        Arrays.sort(pairs, (a, b) -> {
            return a[0] - b[0];
        });
        int[] dp = new int[length];
        int maxNum = 0;
        for (int j = 0; j < length; ++j) {
            dp[j] = 1;
            for (int i = 0; i < j; ++i) {
                if (pairs[i][1] < pairs[j][0]) {
                    dp[j] = Math.max(dp[j], dp[i] + 1);
                }
            }
            maxNum = Math.max(dp[j], maxNum);
        }


        return maxNum;
    }
}